// 扩展BOM表单功能
frappe.ui.form.on('BOM', {
    refresh: function(frm) {
        // 在刷新表单时添加自定义逻辑
    },
    
    // 当表头物料变化时，更新所有工序的价格
    item: function(frm) {
        // 物料变化时重新计算所有工序的价格
        if (frm.doc.operations && frm.doc.operations.length > 0) {
            frm.doc.operations.forEach(function(row) {
                update_operation_price(frm, row);
            });
        }
    },
    
    // 当表头数量变化时，更新所有工序的价格
    quantity: function(frm) {
        if (frm.doc.operations && frm.doc.operations.length > 0) {
            frm.doc.operations.forEach(function(row) {
                update_operation_price(frm, row);
            });
        }
    }
});

// 扩展BOM Operation子表功能
frappe.ui.form.on('BOM Operation', {
    // 当工序变化时
    operation: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        update_operation_price(frm, row);
    },
    
    // 当工作中心变化时
    workstation: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        update_operation_price(frm, row);
    },
    
    // 当供应商变化时
    custom_supplier: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        update_operation_price(frm, row);
    },
    
    // 当计价方式变化时
    custom_rate_type: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        update_operation_price(frm, row);
    },
    
    // 当工时变化时 (影响计时方式的价格计算)
    time_in_mins: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        // 只有当计价方式为计时时才更新
        if (row.custom_rate_type === "By Hour") {
            update_operation_price(frm, row);
        }
    },
    
    // 添加新的处理函数：当含税单价变化时
    custom_service_price_with_tax: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        if (row.custom_service_price_with_tax && row.custom_tax_rate) {
            // 计算不含税单价 = 含税单价 / (1 + 税率/100)
            let tax_rate = row.custom_tax_rate / 100;
            let price_without_tax = flt(row.custom_service_price_with_tax / (1 + tax_rate));
            
            // 检查新值是否与当前值相同（避免循环触发）
            if (Math.abs(flt(row.custom_service_price - price_without_tax)) > 0.001) {
                // 设置标志，表示这是由含税单价触发的更新
                row._updating_from_tax_price = true;
                
                // 更新不含税单价字段
                frappe.model.set_value(cdt, cdn, 'custom_service_price', price_without_tax);
                
                // 清除标志
                setTimeout(() => {
                    row._updating_from_tax_price = false;
                }, 0);
            }
        }
    },
    
    // 当税率变化时
    custom_tax_rate: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        if (row.custom_service_price_with_tax && row.custom_tax_rate) {
            // 计算不含税单价 = 含税单价 / (1 + 税率/100)
            let tax_rate = row.custom_tax_rate / 100;
            let price_without_tax = flt(row.custom_service_price_with_tax / (1 + tax_rate));
            
            // 检查新值是否与当前值相同（避免循环触发）
            if (Math.abs(flt(row.custom_service_price - price_without_tax)) > 0.001) {
                // 更新不含税单价字段
                frappe.model.set_value(cdt, cdn, 'custom_service_price', price_without_tax);
            }
        }
    },
    
    // 当不含税单价变化时，更新含税单价和对应的成本字段
    custom_service_price: function(frm, cdt, cdn) {
        let row = locals[cdt][cdn];
        
        // 如果这是由含税单价触发的更新，不要再触发回去
        if (row._updating_from_tax_price) {
            return;
        }
        
        // 1. 更新含税单价
        if (row.custom_service_price && row.custom_tax_rate) {
            // 计算含税单价 = 不含税单价 * (1 + 税率/100)
            let tax_rate = row.custom_tax_rate / 100;
            let price_with_tax = flt(row.custom_service_price * (1 + tax_rate));
            
            // 检查新值是否与当前值相同（避免循环触发）
            if (Math.abs(flt(row.custom_service_price_with_tax - price_with_tax)) > 0.001) {
                // 更新含税单价字段
                frappe.model.set_value(cdt, cdn, 'custom_service_price_with_tax', price_with_tax);
            }
        }
        
        // 2. 根据计价方式更新对应的成本字段
        if (row.custom_service_price > 0) {
            if (row.custom_rate_type === "By Qty") {
                // 计件：成本 = 单价 * 数量
                let labour_cost = flt(row.custom_service_price * frm.doc.quantity);
                frappe.model.set_value(cdt, cdn, 'custom_labour_cost', labour_cost);
            } else if (row.custom_rate_type === "By Hour") {
                // 计时：成本 = 单价 * (时间分钟 / 60)
                let labour_cost = flt(row.custom_service_price * row.time_in_mins / 60);
                frappe.model.set_value(cdt, cdn, 'custom_labour_cost', labour_cost);
            } else if (row.custom_rate_type === "Subcontracting") {
                // 委外：成本 = 单价 * 数量
                let subcontracting_cost = flt(row.custom_service_price * frm.doc.quantity);
                frappe.model.set_value(cdt, cdn, 'custom_subcontracting_cost', subcontracting_cost);
            }
        }
    }
});

// 统一的工序价格更新函数，根据计价方式调用不同的价格获取逻辑
function update_operation_price(frm, row) {
    // 检查必要字段是否已填写
    if (!frm.doc.company || !frm.doc.item || !row.operation) {
        return;
    }
    
    // 根据计价方式处理
    if (row.custom_rate_type === "Subcontracting") {
        // 委外方式需要供应商
        if (!row.custom_supplier) {
            return;
        }
        update_subcontracting_price(frm, row);
    } 
    else if (row.custom_rate_type === "By Hour" || row.custom_rate_type === "By Qty") {
        // 计时/计件方式
        update_hourly_or_qty_price(frm, row);
    }
}

// 更新委外单价的函数
function update_subcontracting_price(frm, row) {
    if (!frm.doc.quantity) {
        return;
    }
    
    // 调用后端方法获取委外单价
    frappe.call({
        method: "light_mes.light_mes.doctype.subcontracting_service_price.subcontracting_service_price.get_subcontracting_price",
        args: {
            company: frm.doc.company,
            supplier: row.custom_supplier,
            qty: frm.doc.quantity, // 使用表头的数量
            item_code: frm.doc.item,
            operation: row.operation,
            // 使用当前日期
            price_date: frappe.datetime.get_today()
        },
        callback: function(r) {
            if (r.message !== undefined) {
                // 更新单价字段
                frappe.model.set_value(row.doctype, row.name, 'custom_service_price', r.message);
                
                // 如果价格为0，显示提示
                if (r.message === 0) {
                    frappe.show_alert({
                        message: __('No subcontracting price found for the selected item, operation and supplier.'),
                        indicator: 'orange'
                    });
                }
                
                // 如果有税率，同时更新含税单价
                if (row.custom_tax_rate) {
                    let tax_rate = flt(row.custom_tax_rate) / 100;
                    let price_with_tax = flt(r.message * (1 + tax_rate));
                    frappe.model.set_value(row.doctype, row.name, 'custom_service_price_with_tax', price_with_tax);
                }
                
                // 更新委外成本
                if (r.message > 0) {
                    let subcontracting_cost = flt(r.message * frm.doc.quantity);
                    frappe.model.set_value(row.doctype, row.name, 'custom_subcontracting_cost', subcontracting_cost);
                }
            }
        }
    });
}

// 更新计时/计件单价的函数
function update_hourly_or_qty_price(frm, row) {
    if (!row.operation) {
        return;
    }
    
    // 创建row的一个干净副本，避免循环引用和非JSON序列化属性
    let operation_data = {};
    
    // 复制所有非函数、非下划线开头的属性
    for (let key in row) {
        if (
            typeof row[key] !== 'function' && // 排除方法
            !key.startsWith('_') && // 排除内部属性
            row[key] !== undefined && // 排除undefined值
            row[key] !== null // 排除null值
        ) {
            operation_data[key] = row[key];
        }
    }
    
    // 添加主表信息
    let parent_doc = {};
    for (let key in frm.doc) {
        if (
            typeof frm.doc[key] !== 'function' && // 排除方法
            !key.startsWith('_') && // 排除内部属性
            !Array.isArray(frm.doc[key]) && // 排除子表
            frm.doc[key] !== undefined && // 排除undefined值
            frm.doc[key] !== null // 排除null值
        ) {
            parent_doc[key] = frm.doc[key];
        }
    }
    operation_data.parent_doc = parent_doc;
    
    // 调用后端方法获取工序单价
    frappe.call({
        method: "light_mes.light_mes.doctype.operation_price_strategy.operation_price_strategy.get_operation_price_for_bom",
        args: {
            product: frm.doc.item,
            operation: operation_data,
            price_date: frappe.datetime.get_today()
        },
        callback: function(r) {
            if (r.message !== undefined) {
                // 更新单价字段
                frappe.model.set_value(row.doctype, row.name, 'custom_service_price', r.message);
                
                // 如果价格为0，显示提示
                if (r.message === 0) {
                    frappe.show_alert({
                        message: __(`No service price found for the selected row.`),
                        indicator: 'orange'
                    });
                }
                
                // 更新劳务成本
                if (r.message > 0) {
                    let labour_cost = 0;
                    if (row.custom_rate_type === "By Hour") {
                        // 计时：成本 = 单价 * (时间分钟 / 60)
                        labour_cost = flt(r.message * row.time_in_mins / 60);
                    } else if (row.custom_rate_type === "By Qty") {
                        // 计件：成本 = 单价 * 数量
                        labour_cost = flt(r.message * frm.doc.quantity);
                    }
                    frappe.model.set_value(row.doctype, row.name, 'custom_labour_cost', labour_cost);
                }
            }
        }
    });
} 